package drugdealer.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Vector;

import drugdealer.dados.Consulta;
import drugdealer.dados.Medico;
import drugdealer.dados.Paciente;
import drugdealer.dados.Solicitacao;
import drugdealer.persistencia.exceptions.AlreadyExistsException;
import drugdealer.persistencia.exceptions.DoesNotExistsException;

public class ConsultaPersistence extends TablePersistence implements IConsultaPersistence {
	public static String TABLENAME = "consulta";
	public static String PRIMARYKEY = "codigo";
	
	private SolicitacaoPersistence solConn;
	
	public ConsultaPersistence(DDPersistence owner) {
		super(owner);
		this.tableName = ConsultaPersistence.TABLENAME;
		this.primaryKey = ConsultaPersistence.PRIMARYKEY;
		
		this.solConn = new SolicitacaoPersistence(owner);
		
		this.createTableStmt =
			"CREATE TABLE IF NOT EXISTS " + ConsultaPersistence.TABLENAME + "(" +
			ConsultaPersistence.PRIMARYKEY + " integer PRIMARY KEY AUTOINCREMENT," +
			"cpf_paciente varchar(11) NOT NULL," +
			"cpf_medico varchar(11) NOT NULL," +
			"cid varchar(10)," +
			"diagnostico TEXT," +
			"data varchar(10)," +
			
			"FOREIGN KEY (cpf_paciente) REFERENCES " + 
			PacientePersistence.TABLENAME + "(" + PacientePersistence.PRIMARYKEY +
			") ON DELETE CASCADE," +
			
			"FOREIGN KEY (cpf_medico) REFERENCES " + MedicoPersistence.TABLENAME +
			"(" + MedicoPersistence.PRIMARYKEY + ") ON DELETE CASCADE" +
			")";
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.TableConnection#createTable()
	 */
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#createTable()
	 */
	public void createTable() throws SQLException {
		this.solConn.createTable();
		super.createTable();
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#get(int)
	 */
	public Consulta get(int codigo) {
		Consulta consulta = null;
		String selectConsultas = 
			"SELECT * FROM " + ConsultaPersistence.TABLENAME + 
			" WHERE " + ConsultaPersistence.PRIMARYKEY + "=" + codigo;
		String selectSolicitacoes =
			"SELECT * FROM " + 
			SolicitacaoPersistence.TABLENAME + " WHERE cod_consulta=" + 
			codigo;
		
		System.out.println(selectConsultas);
		System.out.println(selectSolicitacoes);
		
		try {
			Statement s = this.ddc.createStatement();
			ResultSet rs = s.executeQuery(selectConsultas);
			
			if (rs.next()) {
				consulta = new Consulta(rs.getInt(ConsultaPersistence.PRIMARYKEY),
						(Paciente) this.ddc.get(
								DDPersistence.PACIENTE, 
								rs.getString("cpf_paciente")),
						(Medico) this.ddc.get(
								DDPersistence.MEDICO, 
								rs.getString("cpf_medico")),
						rs.getString("cid"),
						rs.getString("diagnostico"),
						(new SimpleDateFormat("dd/MM/yyyy")).parse(
								rs.getString("data"))
				);
				rs.close();
				
				rs = s.executeQuery(selectSolicitacoes);
				while(rs.next())
					consulta.inserirSolicitacao(new Solicitacao(
							rs.getInt("cod_remedio"), rs.getInt("quantidade"),
							(rs.getInt("status") == 1)));
			}
			rs.close();			
			s.close ();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return consulta;
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#getList(drugdealer.dados.Paciente)
	 */
	public Vector<String[]> getList(Paciente paciente) {
		return super.getList(ConsultaPersistence.PRIMARYKEY, "cpf_paciente",
				paciente.getCPF());
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#getConsultas(drugdealer.dados.Paciente)
	 */
	public Vector<Consulta> getConsultas(Paciente paciente) {
		Vector<Consulta> consultas = new Vector<Consulta>();
		String selectConsultas = 
			"SELECT * FROM " + ConsultaPersistence.TABLENAME + 
			" WHERE cpf_paciente=" + paciente.getCPF();
		
		System.out.println(selectConsultas);
		
		try {
			Statement s = this.ddc.createStatement();
			ResultSet rs = s.executeQuery(selectConsultas);
			
			while (rs.next()) {
				Consulta c = new Consulta(
						rs.getInt(ConsultaPersistence.PRIMARYKEY),
						paciente, null, null, null,
						(new SimpleDateFormat("dd/MM/yyyy")).parse(
								(rs.getString("data"))));

				c.setSolicitacoes(this.getSolicitacoes(c));

				consultas.add(c);
			}
			rs.close();			
			s.close ();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return consultas;
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#add(drugdealer.dados.Consulta)
	 */
	public void add(Consulta consulta) throws AlreadyExistsException {
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		String insertConsulta = "INSERT INTO " + ConsultaPersistence.TABLENAME +
				" VALUES (" + consulta.getCodigo() + ",'" +
				consulta.getPaciente().getCPF() + "','" + 
				consulta.getMedico().getCPF() + "','" + 
				consulta.getCID() + "','" + consulta.getDiagnostico() + "','" +
				formato.format(consulta.getData()) + "')";
		super.add(insertConsulta);
		this.solConn.add(consulta);
	}

	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#update(drugdealer.dados.Consulta)
	 */
	public void update(Consulta consulta) throws DoesNotExistsException {
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		super.update("UPDATE " + ConsultaPersistence.TABLENAME +
				" SET cpf_paciente='" + consulta.getPaciente().getCPF() + "'," +
				"cpf_medico='" + consulta.getMedico().getCPF() + "', " +
				"cid='" + consulta.getCID() + "', " +
				"diagnostico='" + consulta.getDiagnostico() + "', " +
				"data='" + formato.format(consulta.getData()) + "' " +
				"WHERE " +
				ConsultaPersistence.PRIMARYKEY + "=" + consulta.getCodigo());
		this.solConn.removeAll(consulta);
		try {
			this.solConn.add(consulta);
		} catch (AlreadyExistsException e) {
			e.printStackTrace();
		}
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#remove(drugdealer.dados.Consulta)
	 */
	public void remove(Consulta consulta) {
		this.solConn.removeAll(consulta);
		super.remove(ConsultaPersistence.TABLENAME, 
				ConsultaPersistence.PRIMARYKEY, consulta.getCodigo());
	}
	
	// ---- Solicitacao ------------------------------------------------------
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#addSolicitacao(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void addSolicitacao(Consulta consulta, Solicitacao solicitacao) 
			throws AlreadyExistsException {
		this.solConn.add(consulta, solicitacao);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#getSolicitacoes(drugdealer.dados.Consulta)
	 */
	public Vector<Solicitacao> getSolicitacoes(Consulta consulta) {
		return this.solConn.getList(consulta);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#removeSolicitacao(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void removeSolicitacao(Consulta consulta, Solicitacao solicitacao) {
		this.solConn.remove(consulta, solicitacao);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IConsultaPersistence#updateSolicitacao(drugdealer.dados.Consulta, drugdealer.dados.Solicitacao)
	 */
	public void updateSolicitacao(Consulta consulta, Solicitacao solicitacao)
			throws DoesNotExistsException {
		this.solConn.update(consulta, solicitacao);
	}
	
}
